package cn.xshi.oauth.client.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * <p>
 * 授权中心客户端配置
 * </p>
 *
 * @author dengcj
 * @since 2023-04-19 10:21:25
 */
@Configuration
@Data
@Slf4j
public class OauthClientConfig {

    @Value("${jehc.oauth.hps:}")
    private String hps;//集群服务端IP+端口（如：192.168.1.100:22088,192.168.1.100:22089）

    @Value("${jehc.oauth.address:}")
    private String address;//集群服务端IP+端口（如：192.168.1.100,192.168.1.100）

    @Value("${jehc.oauth.port:22088}")
    private Integer port;//端口默认22088

    @Value("${jehc.oauth.retryTime:20}")
    private Integer retryTime;//重试时间（连接失败，多久开始重试连接：默认20s）

    @Value("${jehc.oauth.oauthServerId:oauthServer}")
    private String oauthServerId;//客户端id（每个服务对应一个客户端唯一id）

    @Value("${jehc.oauth.oauthServerGroupId:oauthServer}")
    private String oauthServerGroupId;//组Id（可以存多个服务共享一个组Id）

    /**
     *
     * @return
     */
    @Bean(name = "oauthClientThreadPool")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setCorePoolSize(5);//业务实时推送（核心线程数，线程池中始终存活的线程数 默认5）
        pool.setMaxPoolSize(10); //业务实时推送（最大线程数，线程池中允许的最大线程数，当线程池的任务队列满了之后可以创建的最大线程数。默认10）
        pool.setQueueCapacity(100);//队列容量,当核心线程数达到最大时，新任务会放在队列中排队等待执行（业务实时推送（使用有界队列允许存放100个任务，避免OOM 默认100））
        pool.setKeepAliveSeconds(300);//线程空闲时间（业务实时推送（最大线程数可以存活的时间，当线程中没有任务执行时，最大线程就会销毁一部分，最终保持核心线程数量的线程。默认300s））
        pool.setAllowCoreThreadTimeOut(false);//线程空闲时间,当线程空闲时间达到keepAliveSeconds(秒)时,线程会退出,直到线程数量等于corePoolSize,如果allowCoreThreadTimeout=true,则会直到线程数量等于0
        pool.setRejectedExecutionHandler(new RejectedExecutionHandler() {//自定义拒绝策略
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                log.warn("授权中心客户端处理任务较慢 ,线程池丢弃该任务！");//业务日志一个小时预计写入500*5MB
            }
        });
        //pool.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy());
        return pool;
    }
}
